/**
 * ts的类 是用来分装或者是复杂类型的约束的。
 * 
 */

// class Person{
//     //声明属性 ts的目的是做js的类型约束，所以需要先给属性约束一个类型
//     name:string;
//     age:number;
//     // 构造函数   类型约束
//     constructor(name:string, age:number){
//         this.name = name;
//         this.age = age;
//     }
//     //方法
//     sayHello(){
//         console.log(`你好，我是${this.name}, 今年${this.age}岁`);
//     }
// }


//class 里面的成员（属性+方法） 是可以使用修饰符进行修饰的、
// public   公开的     哪里都可以用
// private  私有的      只有在自己类中使用
// protected  受保护的   只有在自己和子类使用 在外面不能使用
class Person{
    //声明公有属性
    public name:string;
    public age:number;   
    //声明受保护的类
    protected sex:string;
    //声明私有属性
    private money:number;
    //构造函数
    constructor(name:string, age:number, sex:string, money:number){
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.money = money;
    }
    //方法
    public sayHello(){
        console.log(`你好，我是${this.name}, 今年${this.age}岁，我是${this.sex}生。我有${this.money}元。`);
    }
}
// let p = new Person('蛋蛋', 18);
// p.age = 20;
// p.name = '哈哈';
// p.sayHello();

//继承上面的类
class Student extends Person{
    public sno:string;
    constructor(name:string, age:number, sno:string){
        super(name, age, '男',100);
        this.sno = sno;
        this.sex = '女';
        // this.money=200;
    }
    public sayHello(){
        //调用父类的方法 
        super.sayHello();
        console.log(`我的学号是${this.sno}`);
        // console.log(this.money);
        console.log(`我的性别是${this.sex}`);
    }
}
let s = new Student('李四', 20, '001');
s.sayHello();


/**
 * 类里面有两个修饰符  
 *      readonly 只读的
 *      static 静态的：实例成员需要通过实例对象来调用.
 *            一般和类型相关，和具体的某个实例无关的操作，我们一般会放到静态上   
 */

//readonly
class A{
    readonly name:string; // 只读属性
    constructor(name:string){
        //构造函数里面是可以赋值的
        this.name = name;
    }
    eat(){
        //方法里面是不能赋值只读属性的的，
        // this.name = '222';
    }
}
//只读属性只能获取不能赋值
let ss = new A('张三');
// ss.name = 'ssss';



//static
class B{
    static count:number = 0; // 静态属性
    static getCount():number{
        return B.count;
    }
}
//都是静态成员
B.count = 10;
B.getCount();


